/**
 * 
 */
package fr.gfi.agraf.vue.action.gerer.saisie;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import fr.gfi.agraf.exception.AgrafException;
import fr.gfi.agraf.service.ISaisieService;
import fr.gfi.agraf.utils.DateUtils;
import fr.gfi.agraf.utils.PropertiesUtils;
import fr.gfi.agraf.utils.SpringFactory;
import fr.gfi.agraf.utils.VerificationUtils;
import fr.gfi.agraf.vue.action.AbstractApplicationSupportAction;
import fr.gfi.agraf.vue.bean.EtatDTO;
import fr.gfi.agraf.vue.bean.SaisieDTO;

/**
 * @author Zakaria
 *
 */
public class TraiterSaisieAction extends AbstractApplicationSupportAction {

	public static final String REINITIALISER_SAISIE = "reinitialiserSaisie";
	private static final String ERREUR_DONNEES_INCOHERENTE = "erreur.donnees.incoherente.modifier.perimetre";
	private static final String SAISIE_SERVICE = "SaisieService";

	/**
	 * 
	 */
	private static final long serialVersionUID = 7796380187537689061L;

	/**
	 * Ids des saisies à supprimer
	 * 
	 */
	private Long[] idSaisieTab;

	/**
	 * Ids des taches concernées
	 * 
	 */
	private Long[] idTacheTab;

	private Double[] consommeTab;

	private Double[] rafTab;

	private String[] commentaireTab;

	private String[] dateTab;

	private Long[] etatTab;
	
	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger.getLogger(TraiterSaisieAction.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.vue.action.AbstractApplicationSupportAction#executeAction()
	 */
	@Override
	public String executeAction() throws Exception {
		final List<Long> idSaisieSupprimerList = getIdSaisieSupprimerList();
		final List<SaisieDTO> saisieList = getSaisiesList();
		// récupere le service
		final ISaisieService saisieService = (ISaisieService) SpringFactory.getApplicationContext().getBean(
				SAISIE_SERVICE);
		try {
			// appel au service
			saisieService.supprimerSaisies(idSaisieSupprimerList);
			saisieService.ajouterSaisies(saisieList);
			sessionMap.put(REINITIALISER_SAISIE, true);
			addActionMessage("Les saisies ont bien été traitées");
		} catch (final AgrafException ae) {
			// Recupére le message d'erreur
			final String messageErreur= PropertiesUtils.getProperty(ae.getKey(), ae.getArgs());
			// Ajoute action error
			addActionError(messageErreur);
			LOGGER.error(messageErreur, ae);
			return ERROR;
		}
		return SUCCESS;
	}

	/**
	 * Créer les taches et les saisies
	 * 
	 * @return
	 */
	private List<SaisieDTO> getSaisiesList() {
		final List<SaisieDTO> saisieList = new ArrayList<SaisieDTO>();
		if (idTacheTab != null && idTacheTab.length > 0) {
			for (int i = 0; i < idTacheTab.length; i++) {
				final EtatDTO etat = new EtatDTO();
				etat.setId(etatTab[i]);
				final SaisieDTO saisie = new SaisieDTO();
				saisie.setIdTache(idTacheTab[i]);
				saisie.setConsomme(consommeTab[i]);
				saisie.setDate(DateUtils.stringToDate(dateTab[i]));
				saisie.setEtat(etat);
				saisie.setRaf(rafTab[i]);
				saisie.setValidee(false);
				final String commentaire = commentaireTab[i];
				if (!StringUtils.equals(commentaire, "-1")) {
					saisie.setCommentaire(commentaire);
				}
				saisieList.add(saisie);
			}
		}
		return saisieList;
	}

	/**
	 * @return
	 */
	private List<Long> getIdSaisieSupprimerList() {
		List<Long> idSaisieSupprimer = null;
		if (idSaisieTab != null) {
			idSaisieSupprimer = new ArrayList<Long>(Arrays.asList(idSaisieTab));
		}
		return idSaisieSupprimer;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.opensymphony.xwork2.ActionSupport#validate()
	 */
	@Override
	public void validate() {
		if (!VerificationUtils.checkAreInputTabsOk(idTacheTab, consommeTab, rafTab, commentaireTab, dateTab,
				etatTab)) {
			addActionError(ERREUR_DONNEES_INCOHERENTE);
		}
		if ((null == idTacheTab || idTacheTab.length == 0)
				&& (idSaisieTab == null || idSaisieTab.length == 0)) {
			addActionError(ERREUR_DONNEES_INCOHERENTE);
			return;
		}

		super.validate();
	}

	/**
	 * @return the idSaisieTab
	 */
	public Long[] getIdSaisieTab() {
		return idSaisieTab;
	}

	/**
	 * @param idSaisieTab
	 *            the idSaisieTab to set
	 */
	public void setIdSaisieTab(final Long[] idSaisieTab) {
		this.idSaisieTab = idSaisieTab;
	}

	/**
	 * @return the idTacheTab
	 */
	public Long[] getIdTacheTab() {
		return idTacheTab;
	}

	/**
	 * @param idTacheTab
	 *            the idTacheTab to set
	 */
	public void setIdTacheTab(final Long[] idTacheTab) {
		this.idTacheTab = idTacheTab;
	}

	/**
	 * @return the consommeTab
	 */
	public Double[] getConsommeTab() {
		return consommeTab;
	}

	/**
	 * @param consommeTab
	 *            the consommeTab to set
	 */
	public void setConsommeTab(final Double[] consommeTab) {
		this.consommeTab = consommeTab;
	}

	/**
	 * @return the rafTab
	 */
	public Double[] getRafTab() {
		return rafTab;
	}

	/**
	 * @param rafTab
	 *            the rafTab to set
	 */
	public void setRafTab(final Double[] rafTab) {
		this.rafTab = rafTab;
	}

	/**
	 * @return the commentaireTab
	 */
	public String[] getCommentaireTab() {
		return commentaireTab;
	}

	/**
	 * @param commentaireTab
	 *            the commentaireTab to set
	 */
	public void setCommentaireTab(final String[] commentaireTab) {
		this.commentaireTab = commentaireTab;
	}

	/**
	 * @return the dateTab
	 */
	public String[] getDateTab() {
		return dateTab;
	}

	/**
	 * @param dateTab
	 *            the dateTab to set
	 */
	public void setDateTab(final String[] dateTab) {
		this.dateTab = dateTab;
	}

	/**
	 * @return the etatTab
	 */
	public Long[] getEtatTab() {
		return etatTab;
	}

	/**
	 * @param etatTab
	 *            the etatTab to set
	 */
	public void setEtatTab(final Long[] etatTab) {
		this.etatTab = etatTab;
	}

}
